package com.hhxy.controller;

import com.hhxy.config.DelayedQueueConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * @author ghp
 * @date 2023/2/25
 * @title 生产者
 * @description 用于发送延迟消息
 */
@Slf4j
@RestController
@RequestMapping("/ttl")
public class SendMessageController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送消息（TTL写死的）
     * @param message
     */
    @GetMapping("/sendMsg/{message}")
    public void sendMsg(@PathVariable String message) {
        log.info("当前时间:{}, 发送一条消息给队列A和队列B:{}", new Date(), message);
        // 消息发送给X交换机，指定交换机的RoutingKey为 AX，该消息会发送给A队列，消息为第三给参数
        rabbitTemplate.convertAndSend("X", "AX", "来自ttl为10s的队列消息: " + message);
        // 消息发送给X交换机，指定交换机的RoutingKey为 BX，该消息会发送给B队列，消息为第三给参数
        rabbitTemplate.convertAndSend("X", "BX", "来自ttl为60s的队列消息: " + message);
    }

    /**
     * 发送消息（TTL由请求给出）
     * @param message
     * @param ttlTime
     */
    @GetMapping("/sendMsg/{ttlTime}/{message}")
    public void sendMsg(@PathVariable("ttlTime") String ttlTime,
                        @PathVariable("message") String message) {
        log.info("当前时间:{}, 发送一条时长是{}毫秒TTL信息给队列T:{}", new Date(), ttlTime, message);
        rabbitTemplate.convertAndSend("X", "TX", message, msg -> {
            // 设置消息的TTL（单位ms）
            msg.getMessageProperties().setExpiration(ttlTime);
            return msg;
        });
    }

    /**
     * 发送消息（基于延迟插件实现的延迟队列）
     */
    @GetMapping("/sendMsg2/{ttlTime}/{message}")
    public void sendMsg2(@PathVariable("ttlTime") Integer ttlTime,
                        @PathVariable("message") String message) {
        log.info("当前时间:{}, 发送一条时长是{}毫秒TTL信息给延迟队列delayed.queue:{}", new Date(), ttlTime, message);
        rabbitTemplate.convertAndSend("delayed.exchange", "delayed.routingkey", message, msg -> {
            // 设置消息的延迟时间（单位ms）
            msg.getMessageProperties().setDelay(ttlTime);
            return msg;
        });
    }


}
